/* Copyright (c) 2006 celumsolutions. All Rights Reserved. */
package com.swingolf.tool;

import org.springframework.util.StringUtils;

import java.io.*;
import java.util.*;

/**
 * @author rudolf.traunmueller
 * @since 21.09.11
 */
public class ScrambleFinder {

  String input = "André;Henrioud;SH3;1942;0.7;Cremin;CH;;;;;\n" +
      "Jürgen;Johanndress;SH3;1940;36;Westenholz;GER;;;;;\n" +
      "Didier;Maugras;SH2;;2.0;Montenois;FRANCE;;;;;\n" +
      "Horst;Stobbe;SH1;1964;31.2;Schwansen;GER;;;;;\n" +
      "Johannes;Haselsteiner;SH1;1985;2.3;SGC Mostviertel;AUT;;;;;\n" +
      "Agnes;Schlieper;SF3;1937;30.8;Essen;GER;;;;;\n" +
      "Erwin;Simak;SH1;1972;2.6;Linz ;AUT;;;;;\n" +
      "Martin;Heeb;SH1;1972;30;Essen;GER;;;;;\n" +
      "Martin;Kleiber;SH1;1969;3.0;Harz;GER;;;;;\n" +
      "Christian;Steineder;SH1;1978;36.0;Linz ;AUT;;;;;\n" +
      "Daniel;Fawer;SH2;1948;3.2;Cremin;CH;;;;;\n" +
      "Magdalena;Zill;SF1;1986;29.6;Allgäu-Bodensee;GER;;;;;\n" +
      "Daniel;Blanc;SH2;;3.6;Triangle VERT;FRANCE;;;;;\n" +
      "Anja;Niebler;SF1;1969;29.1;Renningen;GER;;;;;\n" +
      "Joachim;Senf;SH1;1966;3.6;Allgäu-Bodensee;GER;;;;;\n" +
      "Thomas;Langer;SH1;1974;36.0;Linz ;AUT;;;;;\n" +
      "Marc;Demanges;SH1;;3.7;Montenois;FRANCE;;;;;\n" +
      "Anni;Sasse;SF3;1939;28.6;Westenholz;GER;;;;;\n" +
      "Bodo;Lucas;SH3;1938;3.7;Westenholz;GER;;;;;\n" +
      "Florian;Petermaier;SH1;1984;36.0;SGC Mostviertel;AUT;;;;;\n" +
      "Friedrich;Braun;SH2;;3.8;Paulushofen;GER;;;;;\n" +
      "Roland;Bachleitner;SH1;;36.0;SGC Mostviertel;AUT;;;;;\n" +
      "Tobias;Schramm;SH1;1986;4.1;Harz;GER;;;;;\n" +
      "Markus;Hodovanec;SH1;;36.0;Linz ;AUT;;;;;\n" +
      "Christian;Legrand;SH3;;4.2;Meslay-du-Maine;FRANCE;;;;;\n" +
      "Viktoria;Kohler;SF1;1962;28.4;Allgäu-Bodensee;GER;;;;;\n" +
      "Nicole;Norcini;SF2;;4.6;Montenois;FRANCE;;;;;\n" +
      "Ludwig;Meier;SH3;1939;27.1;Horbach;GER;;;;;\n" +
      "Jean Pierre;Weber;SH3;1940;5.1;ST. Cergue;CH;;;;;\n" +
      "Ramona;Meier;SH3;1939;27;Horbach;GER;;;;;\n" +
      "Antonio;Bouca;SH3;1944;5.2;St Christine;FRANCE;;;;;\n" +
      "Catherine;Zill;SF1;1989;24.5;Allgäu-Bodensee;GER;;;;;\n" +
      "Josef;Heiß;SH2;1959;5.7;SGC Mostviertel;AUT;;;;;\n" +
      "Thomas;Kümmel;SH1;1969;24;Renningen;GER;;;;;\n" +
      "Ulrich;Kramer;SH2;1956;6.1;Harz;GER;;;;;\n" +
      "Andreas;Wagner;SH1;1986;36.0;SGC Mostviertel;AUT;;;;;\n" +
      "Daniel;Cadot;SH3;;6.1;Meslay-du-Maine;FRANCE;;;;;\n" +
      "Peter;Wingen;SH2;1953;22.9;Horbach;GER;;;;;\n" +
      "Jens;Carol;SH1;;6.2;Paulushofen;GER;;;;;\n" +
      "Ralph;Tittes;SH1;;6.3;Paulushofen;GER;;;;;\n" +
      "Jens;Mierdel;SH1;1966;6.4;Allgäu-Bodensee;GER;;;;;\n" +
      "Jacques;Renard;SH3;;6.6;Grand Lieu;FRANCE;;;;;\n" +
      "Gregor;Freitag;SH1;1961;6.8;Renningen;GER;;;;;\n" +
      "Chantal;Cadot;SF2;;6.9;Meslay-du-Maine;FRANCE;;;;;\n" +
      "Ronny;Streuber;SH1;;7.0;Paulushofen;GER;;;;;\n" +
      "Joachim;Mittag;SH2;1958;7.1;Allgäu-Bodensee;GER;;;;;\n" +
      "Bernfried;Ebbesmeier;SH1;;7.1;Paulushofen;GER;;;;;\n" +
      "Monique;Mathieu;SF3;1938;7.2;Nantes;FRANCE;;;;;\n" +
      "Jean-Luc;Hautbois;SH2;;7.6;Meslay-du-Maine;FRANCE;;;;;\n" +
      "Norbert;Peitz;SH2;1953;7.7;Westenholz;GER;;;;;\n" +
      "Reinhard;Philipp;SH3;1944;7.7;Allgäu-Bodensee;GER;;;;;\n" +
      "Jacques;Desnos;SH2;;7.7;Meslay-du-Maine;FRANCE;;;;;\n" +
      "Nadine;Mierdel;SF1;1985;7.8;Allgäu-Bodensee;GER;;;;;\n" +
      "Peter;Zodel;SH1;1974;8.0;Allgäu-Bodensee;GER;;;;;\n" +
      "Christian;Stöber;SH1;1982;8.1;Essen;GER;;;;;\n" +
      "Serge;Nantillet;SH2;;8.7;Triangle VERT;FRANCE;;;;;\n" +
      "Margarete;Hane;SF1;1963;9.5;Westenholz;GER;;;;;\n" +
      "Ralf;Peter;SH1;1975;9.6;Horbach;GER;;;;;\n" +
      "Pierre;Guiheneuc;SH2;;9.8;Rouge;FRANCE;;;;;\n" +
      "Gerhard;Scheuch;SH1;1964;10.1;SGC Mostviertel;AUT;;;;;\n" +
      "Sabine;Kleiber;SF1;1963;10.2;Harz;GER;;;;;\n" +
      "Johann;Neumeier;SH2;;10.2;Paulushofen;GER;;;;;\n" +
      "Raffael;Gietl;SH1;;10.3;Paulushofen;GER;;;;;\n" +
      "Jean-Claude;Mathieu;SH3;1935;10.5;Nantes;FRANCE;;;;;\n" +
      "Stefan;Buchbauer;SH1;1961;11.3;Horbach;GER;;;;;\n" +
      "Maximilian ;Waffler;SH1;;11.3;Paulushofen;GER;;;;;\n" +
      "Jürgen;Wojtek;SH1;1965;11.9;Horbach;GER;;;;;\n" +
      "Alain;Grossenbacher;SH1;1972;12.1;Cremin;CH;;;;;\n" +
      "Reiner;Pilz;SH1;1962;12.1;Allgäu-Bodensee;GER;;;;;\n" +
      "Frank;Schweizerhof;SH1;1976;12.2;Essen;GER;;;;;\n" +
      "Dirk;Karcher;SH1;;12.2;Paulushofen;GER;;;;;\n" +
      "Uwe;Reinecke;SH2;1958;12.4;Harz;GER;;;;;\n" +
      "Petra;Polischuk;SF1;1962;12.5;Westenholz;GER;;;;;\n" +
      "Franco;Calafuri;SH3;;12.6;Rouge;FRANCE;;;;;\n" +
      "Martin;Gietl;SH1;;12.6;Paulushofen;GER;;;;;\n" +
      "Frank;Vajes;SH1;1969;12.8;Iserloy;GER;;;;;\n" +
      "Mael;Perret;SH1;1986;13.0;Cremin;CH;;;;;\n" +
      "Horst;Harzenetter;SH3;1945;13;Horbach;GER;;;;;\n" +
      "Joël;Pasquier;SH2;;13.4;Grand Lieu;FRANCE;;;;;\n" +
      "Oliver;Gießbeck;SH1;1968;13.4;Horbach;GER;;;;;\n" +
      "Christian;Henry;SH3;;13.8;Grand Lieu;FRANCE;;;;;\n" +
      "Mechthild;Wedekind;SF2;1958;13.8;Essen;GER;;;;;\n" +
      "Marc;Jaquillard;SH3;1944;14.2;ST. Cergue;CH;;;;;\n" +
      "Jeanine;Tremblay;SF3;;14.2;Grand Lieu;FRANCE;;;;;\n" +
      "Heidi;Prinz;SH2;1953;14.3;Allgäu-Bodensee;GER;;;;;\n" +
      "Johannes;Lienbacher;SH1;1972;14.4;SGC Mostviertel;AUT;;;;;\n" +
      "Jocelyne;Donnars;SF3;1933;14.4;Nantes;FRANCE;;;;;\n" +
      "Gabriel;Tremblay;SH3;;14.5;Grand Lieu;FRANCE;;;;;\n" +
      "Francine;Maugras;SH2;;14.8;Montenois;FRANCE;;;;;\n" +
      "Beate;Senf;SF1;1966;14.8;Allgäu-Bodensee;GER;;;;;\n" +
      "Madeleine;Virlouvet;SF3;1934;14.9;De Parigne;FRANCE;;;;;\n" +
      "Burkhard;Helmers;SH2;1958;14.9;Iserloy;GER;;;;;\n" +
      "J. Claude;Chevalley;SH3;1941;15.1;Cremin;CH;;;;;\n" +
      "Marc;Kreuzahler;SH1;1969;15.2;Allgäu-Bodensee;GER;;;;;\n" +
      "Lisa;Karcher;SF1;;15.5;Paulushofen;GER;;;;;\n" +
      "Jens;Andraczek;SH1;1975;15.6;Essen;GER;;;;;\n" +
      "Jean Louis;Bordet;SH2;;16.0;Triangle VERT;FRANCE;;;;;\n" +
      "Klaus;Brill;SH3;1943;16;Renningen;GER;;;;;\n" +
      "Christian;Ring;SH1;1978;16.0;Linz ;AUT;;;;;\n" +
      "Franz;Rabuza;SH1;1976;16.3;Linz ;AUT;;;;;\n" +
      "Arndt;Felderhoff;SH1;1969;16.4;Essen;GER;;;;;\n" +
      "Philippe;Jeannin;SH2;;16.6;Montenois;FRANCE;;;;;\n" +
      "Gérard;Morin;SH2;1946;16.7;St Christine;FRANCE;;;;;\n" +
      "Michel;Kuenzli;SH2;;16.7;Montenois;FRANCE;;;;;\n" +
      "Otto;Hinterholzer;SH2;1955;16.8;SGC Mostviertel;AUT;;;;;\n" +
      "Marie-Thérèse;Legrand;SF3;;16.8;Meslay-du-Maine;FRANCE;;;;;\n" +
      "Birgit;Ambros;SF1;;17.1;Paulushofen;GER;;;;;\n" +
      "Gerhard;Peterseil;SH1;1980;17.2;SGC Mostviertel;AUT;;;;;\n" +
      "Hermann;Teuber;SH3;1940;17.2;Horbach;GER;;;;;\n" +
      "Sylvette;Fawer;SF2;1952;17.4;Cremin;CH;;;;;\n" +
      "Ronny;Kahlert;SH1;1980;17.5;Horbach;GER;;;;;\n" +
      "Konrad;Buritz;SH2;1957;17.9;Harz;GER;;;;;\n" +
      "Jochen;Stirner;SH1;1967;18;Renningen;GER;;;;;\n" +
      "Günter;Hakenes;SH3;1944;18;Westenholz;GER;;;;;\n" +
      "Francine;Allard;SF2;1951;19.0;St Christine;FRANCE;;;;;\n" +
      "Roland;Carnino;SH3;;19.2;Meslay-du-Maine;FRANCE;;;;;\n" +
      "Mickael;Auvie;SH1;;19.4;Montenois;FRANCE;;;;;\n" +
      "Willi;Nolte;SH3;1939;19.6;Westenholz;GER;;;;;\n" +
      "Hans;Söllner;SH2;;20.1;Paulushofen;GER;;;;;\n" +
      "Monique;Carnino;SF3;;20.1;Meslay-du-Maine;FRANCE;;;;;\n" +
      "Françoise;Kuenzli;SF2;;20.4;Montenois;FRANCE;;;;;\n" +
      "Markus;Wedekind;SH2;1959;20.4;Essen;GER;;;;;\n" +
      "Wilhelm;Kindler;SH2;1959;20.7;Renningen;GER;;;;;\n" +
      "Jeanette;Buchbauer;SF1;1964;22.2;Horbach;GER;;;;;\n" +
      "Angela;Mittag;SF2;1955;22.4;Allgäu-Bodensee;GER;;;;;\n" +
      "Peter;Haßler;SH1;1966;22.5;Horbach;GER;;;;;\n" +
      "Ute;Lucas;SF3;1942;22.6;Westenholz;GER;;;;;\n" +
      "Georg;Endreß;SH2;1950;22.7;Horbach;GER;;;;;\n" +
      "Hans;Ziolko;SH3;1946;22.9;Horbach;GER;;;;;\n" +
      "Thomas;Grabner;SH1;1973;23.1;SGC Mostviertel;AUT;;;;;\n" +
      "J. Francois;Faessler;SH3;1943;24.4;ST. Cergue;CH;;;;;\n" +
      "Laurent;Thurnherr;SH1;1986;28.4;Cremin;CH;;;;;\n" +
      "Joël;Muller;SH2;;28.9;Triangle VERT;FRANCE;;;;;\n" +
      "Anna Marie;Boulay;SF2;;29;Grand Lieu;FRANCE;;;;;\n" +
      "Helene;Weber;SF3;1936;30.6;ST. Cergue;CH;;;;;\n" +
      "Christian;Poirot;SH2;;33.1;Triangle VERT;FRANCE;;;;;\n" +
      "Chantale;Muller;SF2;;33.2;Triangle VERT;FRANCE;;;;;\n" +
      "Paul;Fink;SH2;1952;34.7;SGC Mostviertel;AUT;;;;;\n" +
      "Alexandra;Moser;SF1;1975;35.2;SGC Mostviertel;AUT;;;;;\n" +
      "Günther;Oppel;SH1;;36.0;SGC Mostviertel;AUT;;;;;\n" +
      "Rudolf;Schneider;SH3;;36.0;SGC Mostviertel;AUT;;;;;\n" +
      "Manuel;Bachleitner;SH1;;36.0;SGC Mostviertel;AUT;;;;;\n" +
      "Peter;Auer;SH1;;36.0;SGC Mostviertel;AUT;;;;;\n" +
      "Michael;Heindl;SH1;;36.0;SGC Mostviertel;AUT;;;;;";

  String solo = "Günther;Oppel;SH1;;36.0;SGC Mostviertel;AUT\n" +
      "Rudolf;Schneider;SH3;;36.0;SGC Mostviertel;AUT\n" +
      "Roland;Bachleitner;SH1;;36.0;SGC Mostviertel;AUT\n" +
      "Manuel;Bachleitner;SH1;;36.0;SGC Mostviertel;AUT\n" +
      "Peter;Auer;SH1;;36.0;SGC Mostviertel;AUT\n" +
      "Michael;Heindl;SH1;;36.0;SGC Mostviertel;AUT\n" +
      "Andreas;Wagner;SH1;1986;36.0;SGC Mostviertel;AUT\n" +
      "Florian;Petermaier;SH1;1984;36.0;SGC Mostviertel;AUT\n" +
      "Markus;Hodovanec;SH1;;36.0;Linz ;AUT\n" +
      "Thomas;Langer;SH1;1974;36.0;Linz ;AUT\n" +
      "Christian;Steineder;SH1;1978;36.0;Linz ;AUT\n" +
      "Alexandra;Moser;SF1;1975;35.2;SGC Mostviertel;AUT\n" +
      "Paul;Fink;SH2;1952;34.7;SGC Mostviertel;AUT\n" +
      "Chantale;Muller;SF2;;33.2;Triangle VERT;FRANCE\n" +
      "Christian;Poirot;SH2;;33.1;Triangle VERT;FRANCE\n" +
      "Horst;Stobbe;SH1;1964;31.2;Schwansen;GER\n" +
      "Agnes;Schlieper;SF3;1937;30.8;Essen;GER\n" +
      "Helene;Weber;SF3;1936;30.6;ST. Cergue;CH\n" +
      "Martin;Heeb;SH1;1972;30;Essen;GER\n" +
      "Magdalena;Zill;SF1;1986;29.6;Allgäu-Bodensee;GER\n" +
      "Anja;Niebler;SF1;1969;29.1;Renningen;GER\n" +
      "Anna Marie;Boulay;SF2;;29;Grand Lieu;FRANCE\n" +
      "Joël;Muller;SH2;;28.9;Triangle VERT;FRANCE\n" +
      "Anni;Sasse;SF3;1939;28.6;Westenholz;GER\n" +
      "Laurent;Thurnherr;SH1;1986;28.4;Cremin;CH\n" +
      "Viktoria;Kohler;SF1;1962;28.4;Allgäu-Bodensee;GER\n" +
      "Ludwig;Meier;SH3;1939;27.1;Horbach;GER\n" +
      "Ramona;Meier;SH3;1939;27;Horbach;GER\n" +
      "Catherine;Zill;SF1;1989;24.5;Allgäu-Bodensee;GER\n" +
      "J. Francois;Faessler;SH3;1943;24.4;ST. Cergue;CH\n" +
      "Thomas;Kümmel;SH1;1969;24;Renningen;GER\n" +
      "Thomas;Grabner;SH1;1973;23.1;SGC Mostviertel;AUT\n" +
      "Hans;Ziolko;SH3;1946;22.9;Horbach;GER\n" +
      "Peter;Wingen;SH2;1953;22.9;Horbach;GER\n" +
      "Christoph;Lehner;SH1;1972;22.8;SGC Mostviertel;AUT\n" +
      "Georg;Endreß;SH2;1950;22.7;Horbach;GER\n" +
      "Ute;Lucas;SF3;1942;22.6;Westenholz;GER\n" +
      "Peter;Haßler;SH1;1966;22.5;Horbach;GER\n" +
      "Angela;Mittag;SF2;1955;22.4;Allgäu-Bodensee;GER\n" +
      "Jeanette;Buchbauer;SF1;1964;22.2;Horbach;GER\n" +
      "Wilhelm;Kindler;SH2;1959;20.7;Renningen;GER\n" +
      "Françoise;Kuenzli;SF2;;20.4;Montenois;FRANCE\n" +
      "Markus;Wedekind;SH2;1959;20.4;Essen;GER\n" +
      "Hans;Söllner;SH2;;20.1;Paulushofen;GER\n" +
      "Monique;Carnino;SF3;;20.1;Meslay-du-Maine;FRANCE\n" +
      "Willi;Nolte;SH3;1939;19.6;Westenholz;GER\n" +
      "Mickael;Auvie;SH1;;19.4;Montenois;FRANCE\n" +
      "Roland;Carnino;SH3;;19.2;Meslay-du-Maine;FRANCE\n" +
      "Francine;Allard;SF2;1951;19.0;St Christine;FRANCE\n" +
      "Jochen;Stirner;SH1;1967;18;Renningen;GER\n" +
      "Günter;Hakenes;SH3;1944;18;Westenholz;GER\n" +
      "Peter;Baumeister;SH3;1941;18.0;Allgäu-Bodensee;GER\n" +
      "Konrad;Buritz;SH2;1957;17.9;Harz;GER\n" +
      "Ronny;Kahlert;SH1;1980;17.5;Horbach;GER\n" +
      "Sylvette;Fawer;SF2;1952;17.4;Cremin;CH\n" +
      "Gerhard;Peterseil;SH1;1980;17.2;SGC Mostviertel;AUT\n" +
      "Hermann;Teuber;SH3;1940;17.2;Horbach;GER\n" +
      "Birgit;Ambros;SF1;;17.1;Paulushofen;GER\n" +
      "Otto;Hinterholzer;SH2;1955;16.8;SGC Mostviertel;AUT\n" +
      "Marie-Thérèse;Legrand;SF3;;16.8;Meslay-du-Maine;FRANCE\n" +
      "Gérard;Morin;SH2;1946;16.7;St Christine;FRANCE\n" +
      "Michel;Kuenzli;SH2;;16.7;Montenois;FRANCE\n" +
      "Philippe;Jeannin;SH2;;16.6;Montenois;FRANCE\n" +
      "Arndt;Felderhoff;SH1;1969;16.4;Essen;GER\n" +
      "Franz;Rabuza;SH1;1976;16.3;Linz ;AUT\n" +
      "Jean Louis;Bordet;SH2;;16.0;Triangle VERT;FRANCE\n" +
      "Klaus;Brill;SH3;1943;16;Renningen;GER\n" +
      "Christian;Ring;SH1;1978;16.0;Linz ;AUT\n" +
      "Jens;Andraczek;SH1;1975;15.6;Essen;GER\n" +
      "Lisa;Karcher;SF1;;15.5;Paulushofen;GER\n" +
      "Marc;Kreuzahler;SH1;1969;15.2;Allgäu-Bodensee;GER\n" +
      "J. Claude;Chevalley;SH3;1941;15.1;Cremin;CH\n" +
      "Madeleine;Virlouvet;SF3;1934;14.9;De Parigne;FRANCE\n" +
      "Burkhard;Helmers;SH2;1958;14.9;Iserloy;GER\n" +
      "Francine;Maugras;SH2;;14.8;Montenois;FRANCE\n" +
      "Beate;Senf;SF1;1966;14.8;Allgäu-Bodensee;GER\n" +
      "Gabriel;Tremblay;SH3;;14.5;Grand Lieu;FRANCE\n" +
      "Johannes;Lienbacher;SH1;1972;14.4;SGC Mostviertel;AUT\n" +
      "Jocelyne;Donnars;SF3;1933;14.4;Nantes;FRANCE\n" +
      "Siegbert;Lau;SH1;1980;14.4;Allgäu-Bodensee;GER\n" +
      "Heidi;Prinz;SH2;1953;14.3;Allgäu-Bodensee;GER\n" +
      "Marc;Jaquillard;SH3;1944;14.2;ST. Cergue;CH\n" +
      "Jeanine;Tremblay;SF3;;14.2;Grand Lieu;FRANCE\n" +
      "Christian;Henry;SH3;;13.8;Grand Lieu;FRANCE\n" +
      "Mechthild;Wedekind;SF2;1958;13.8;Essen;GER\n" +
      "Joël;Pasquier;SH2;;13.4;Grand Lieu;FRANCE\n" +
      "Oliver;Gießbeck;SH1;1968;13.4;Horbach;GER\n" +
      "Mael;Perret;SH1;1986;13.0;Cremin;CH\n" +
      "Horst;Harzenetter;SH3;1945;13;Horbach;GER\n" +
      "Frank;Vajes;SH1;1969;12.8;Iserloy;GER\n" +
      "Franco;Calafuri;SH3;;12.6;Rouge;FRANCE\n" +
      "Martin;Gietl;SH1;;12.6;Paulushofen;GER\n" +
      "Petra;Polischuk;SF1;1962;12.5;Westenholz;GER\n" +
      "Uwe;Reinecke;SH2;1958;12.4;Harz;GER\n" +
      "Frank;Schweizerhof;SH1;1976;12.2;Essen;GER\n" +
      "Dirk;Karcher;SH1;;12.2;Paulushofen;GER\n" +
      "Alain;Grossenbacher;SH1;1972;12.1;Cremin;CH\n" +
      "Reiner;Pilz;SH1;1962;12.1;Allgäu-Bodensee;GER\n" +
      "Jürgen;Wojtek;SH1;1965;11.9;Horbach;GER\n" +
      "Wolfgang;Flachs;SH2;1954;11.6;Allgäu-Bodensee;GER\n" +
      "Stefan;Buchbauer;SH1;1961;11.3;Horbach;GER\n" +
      "Maximilian ;Waffler;SH1;;11.3;Paulushofen;GER\n" +
      "Jean-Claude;Mathieu;SH3;1935;10.5;Nantes;FRANCE\n" +
      "Raffael;Gietl;SH1;;10.3;Paulushofen;GER\n" +
      "Sabine;Kleiber;SF1;1963;10.2;Harz;GER\n" +
      "Johann;Neumeier;SH2;;10.2;Paulushofen;GER\n" +
      "Gerhard;Scheuch;SH1;1964;10.1;SGC Mostviertel;AUT\n" +
      "Pierre;Guiheneuc;SH2;;9.8;Rouge;FRANCE\n" +
      "Ralf;Peter;SH1;1975;9.6;Horbach;GER\n" +
      "Margarete;Hane;SF1;1963;9.5;Westenholz;GER\n" +
      "Timotheus;Grall;SH1;1971;9.5;Allgäu-Bodensee;GER\n" +
      "Serge;Nantillet;SH2;;8.7;Triangle VERT;FRANCE\n" +
      "Christian;Stöber;SH1;1982;8.1;Essen;GER\n" +
      "Peter;Zodel;SH1;1974;8.0;Allgäu-Bodensee;GER\n" +
      "Nadine;Mierdel;SF1;1985;7.8;Allgäu-Bodensee;GER\n" +
      "Norbert;Peitz;SH2;1953;7.7;Westenholz;GER\n" +
      "Reinhard;Philipp;SH3;1944;7.7;Allgäu-Bodensee;GER\n" +
      "Jacques;Desnos;SH2;;7.7;Meslay-du-Maine;FRANCE\n" +
      "Jean-Luc;Hautbois;SH2;;7.6;Meslay-du-Maine;FRANCE\n" +
      "Monique;Mathieu;SF3;1938;7.2;Nantes;FRANCE\n" +
      "Joachim;Mittag;SH2;1958;7.1;Allgäu-Bodensee;GER\n" +
      "Bernfried;Ebbesmeier;SH1;;7.1;Paulushofen;GER\n" +
      "Ronny;Streuber;SH1;;7.0;Paulushofen;GER\n" +
      "Chantal;Cadot;SF2;;6.9;Meslay-du-Maine;FRANCE\n" +
      "Gregor;Freitag;SH1;1961;6.8;Renningen;GER\n" +
      "Jacques;Renard;SH3;;6.6;Grand Lieu;FRANCE\n" +
      "Jens;Mierdel;SH1;1966;6.4;Allgäu-Bodensee;GER\n" +
      "Ralph;Tittes;SH1;;6.3;Paulushofen;GER\n" +
      "Jens;Carol;SH1;;6.2;Paulushofen;GER\n" +
      "Ulrich;Kramer;SH2;1956;6.1;Harz;GER\n" +
      "Daniel;Cadot;SH3;;6.1;Meslay-du-Maine;FRANCE\n" +
      "Josef;Heiß;SH2;1959;5.7;SGC Mostviertel;AUT\n" +
      "Antonio;Bouca;SH3;1944;5.2;St Christine;FRANCE\n" +
      "Jean Pierre;Weber;SH3;1940;5.1;ST. Cergue;CH\n" +
      "Nicole;Norcini;SF2;;4.6;Montenois;FRANCE\n" +
      "Christian;Legrand;SH3;;4.2;Meslay-du-Maine;FRANCE\n" +
      "Tobias;Schramm;SH1;1986;4.1;Harz;GER\n" +
      "Friedrich;Braun;SH2;;3.8;Paulushofen;GER\n" +
      "Marc;Demanges;SH1;;3.7;Montenois;FRANCE\n" +
      "Bodo;Lucas;SH3;1938;3.7;Westenholz;GER\n" +
      "Daniel;Blanc;SH2;;3.6;Triangle VERT;FRANCE\n" +
      "Joachim;Senf;SH1;1966;3.6;Allgäu-Bodensee;GER\n" +
      "Daniel;Fawer;SH2;1948;3.2;Cremin;CH\n" +
      "Martin;Kleiber;SH1;1969;3.0;Harz;GER\n" +
      "Erwin;Simak;SH1;1972;2.6;Linz ;AUT\n" +
      "Johannes;Haselsteiner;SH1;1985;2.3;SGC Mostviertel;AUT\n" +
      "Didier;Maugras;SH2;;2.0;Montenois;FRANCE\n" +
      "André;Henrioud;SH3;1942;0.7;Cremin;CH\n" +
      "Jürgen;Johanndress;SH3;1940;36;Westenholz;GER";


  public List<PlayerDTO> getRandomPlayerListScramble() throws IOException {
    LinkedList<PlayerDTO> players = new LinkedList<PlayerDTO>();
    List<String> lines = org.apache.commons.io.IOUtils.readLines(new ByteArrayInputStream(input.getBytes()));
    Collections.shuffle(lines, new Random(new Date().getTime()));
    System.out.println(lines.size());
    for (String line : lines) {
      String[] player = StringUtils.delimitedListToStringArray(line, ";");
      players.add(new PlayerDTO(player[0], player[1], player[2], 0, Double.parseDouble(player[4]), player[5], player[6]));
    }
    return players;
  }

  public List<PlayerDTO> getRandomPlayerListSolo() throws IOException {
    LinkedList<PlayerDTO> players = new LinkedList<PlayerDTO>();
    List<String> lines = org.apache.commons.io.IOUtils.readLines(new ByteArrayInputStream(solo.getBytes()));
    Collections.shuffle(lines, new Random(new Date().getTime()));
    System.out.println(lines.size());
    for (String line : lines) {
      String[] player = StringUtils.delimitedListToStringArray(line, ";");
      players.add(new PlayerDTO(player[0], player[1], player[2], 0, Double.parseDouble(player[4]), player[5], player[6]));
    }
    return players;
  }

  public void testSolo() throws IOException {
    List<PlayerDTO> players = getRandomPlayerListSolo();
    int playerSize = players.size()/4;
    for (int i = 0; i<playerSize; i++) {
      Collection<PlayerDTO> selection = new HashSet<PlayerDTO>();
      PlayerDTO first = findFirstPlayer(players);
      players.remove(first);
      selection.add(first);
      for (int ii = 0; ii<3; ii++) {
        PlayerDTO next = findNextSolo(selection, players);
        selection.add(next);
      }
      System.out.println("Flight " + (i + 1));
      for (PlayerDTO player : selection) {
        System.out.println(player.toString());
      }
      System.out.println("");
    }
    for (PlayerDTO player : players) {
      System.out.println(player.toString());
    }
  }

  public void testWritePlayers() throws IOException {
    List<PlayerDTO> players = getRandomPlayerListScramble();
    for (PlayerDTO player : players) {
      System.out.println(player.writeShort());
    }
  }

  private PlayerDTO findNextSolo(Collection<PlayerDTO> selection, List<PlayerDTO> players) {
    // other team, next handicap
    LinkedList<PlayerDTO> sortedPlayers = sortAsc(players);
    boolean match = false;
    PlayerDTO oldMatch = null;
    PlayerDTO curMatch = null;
    Iterator<PlayerDTO> iter = sortedPlayers.iterator();
    while (!match && iter.hasNext()) {
      curMatch = iter.next();
      if (oldMatch == null) {
        oldMatch = curMatch;
      }
      if (!contains(selection, curMatch.getTeam()) && germanRule(selection, curMatch)) {
        match = true;
      }
    }
    PlayerDTO actualMatch = curMatch == null ? oldMatch : curMatch;
    players.remove(actualMatch);
    return actualMatch;
  }

  private boolean germanRule(Collection<PlayerDTO> selection, PlayerDTO curMatch) {
    int germanCount = 0;
    for (PlayerDTO player : selection) {
      if (player.getNation().equalsIgnoreCase("GER")) {
        germanCount++;
      }
    }
    return germanCount == 2 && !curMatch.getNation().equalsIgnoreCase("GER") || germanCount<2 && curMatch.getNation().equalsIgnoreCase("GER");
  }

  private boolean contains(Collection<PlayerDTO> selection, String team) {
    for (PlayerDTO player : selection) {
      if (player.getTeam().equalsIgnoreCase(team)) {
        return true;
      }
    }
    return false;
  }

  public void testScramble() throws IOException {
    List<PlayerDTO> players = getRandomPlayerListScramble();
    for (int i = 0; i<144/2; i++) {
      //P first = findFirstPlayer(players);
      //P second = findSecondPlayer(first, players);
      //P first = findFirstPlayer(players);
      //P second = findSecondPlayerVariant2(first, players);
      PlayerDTO first = findFirstPlayer(players);
      PlayerDTO second = findSecondPlayerVariant3(first, players);
      System.out.println("Scramble Team " + (i + 1));
      System.out.println(first.toString());
      System.out.println(second.toString());
      System.out.println("");
    }
    //Assert.assertEquals(0, players.size());
    //System.out.println("not in team " + players.get(0).toString());
  }


  private PlayerDTO findSecondPlayerVariant3(PlayerDTO first, List<PlayerDTO> players) {
    // other team, next handicap
    LinkedList<PlayerDTO> sortedPlayers = sortDesc(players);
    boolean match = false;
    PlayerDTO oldMatch = null;
    PlayerDTO curMatch = null;
    Iterator<PlayerDTO> iter = sortedPlayers.iterator();
    while (!match && iter.hasNext()) {
      curMatch = iter.next();
      if (oldMatch == null) {
        oldMatch = curMatch;
      }
      if (!first.getTeam().equalsIgnoreCase(curMatch.getTeam())) {
        match = true;
      }
    }
    PlayerDTO actualMatch = curMatch == null ? oldMatch : curMatch;
    players.remove(actualMatch);
    return actualMatch;
  }

  private PlayerDTO findSecondPlayerVariant2(PlayerDTO first, List<PlayerDTO> players) {
    // other team, next handicap
    LinkedList<PlayerDTO> sortedPlayers = sortDesc(players);
    boolean match = false;
    PlayerDTO oldMatch = null;
    PlayerDTO curMatch = null;
    Iterator<PlayerDTO> iter = sortedPlayers.iterator();
    while (!match && iter.hasNext()) {
      curMatch = iter.next();
      if (oldMatch == null) {
        oldMatch = curMatch;
      }
      if (!first.getTeam().equalsIgnoreCase(curMatch.getTeam())) {
        oldMatch = curMatch;
        if (!first.getNation().equalsIgnoreCase(curMatch.getNation())) {
          curMatch = oldMatch;
          match = true;
        }
      }
    }
    PlayerDTO actualMatch = curMatch == null ? oldMatch : curMatch;
    players.remove(actualMatch);
    return actualMatch;
  }

  private PlayerDTO findSecondPlayer(PlayerDTO first, LinkedList<PlayerDTO> players) {
    // other nation, next handicap
    LinkedList<PlayerDTO> sortedPlayers = sortDesc(players);
    boolean match = false;
    PlayerDTO oldMatch = null;
    PlayerDTO curMatch = null;
    Iterator<PlayerDTO> iter = sortedPlayers.iterator();
    while (!match && iter.hasNext()) {
      oldMatch = iter.next();
      if (!first.getNation().equals(oldMatch.getNation())) {
        if (!first.getNation().equalsIgnoreCase("GER")) {
          if (oldMatch.getNation().equalsIgnoreCase("GER")) {
            curMatch = oldMatch;
            match = true;
          }
        } else {
          curMatch = oldMatch;
          match = true;
        }
      }
    }
    PlayerDTO actualMatch = curMatch == null ? oldMatch : curMatch;
    players.remove(actualMatch);
    return actualMatch;
  }

  private PlayerDTO findFirstPlayer(List<PlayerDTO> players) {
    LinkedList<PlayerDTO> playersSorted = sortAsc(players);
    PlayerDTO result = playersSorted.get(0);
    players.remove(result);
    return result;
  }

  private LinkedList<PlayerDTO> sortAsc(List<PlayerDTO> players) {
    Map<Double, Set<PlayerDTO>> result = new TreeMap<Double, Set<PlayerDTO>>(new Comparator<Double>() {
      public int compare(Double o1, Double o2) {
        return o1.compareTo(o2);
      }
    });
    for (PlayerDTO player : players) {
      if (!result.containsKey(player.getHcp())) {
        result.put(player.getHcp(), new HashSet<PlayerDTO>());
      }
      result.get(player.getHcp()).add(player);
    }
    LinkedList<PlayerDTO> result2 = new LinkedList();
    for (Map.Entry<Double, Set<PlayerDTO>> entries : result.entrySet()) {
      result2.addAll(entries.getValue());
    }
    return result2;
  }

  private LinkedList<PlayerDTO> sortDesc(List<PlayerDTO> players) {
    LinkedList result = new LinkedList(players);
    result = sortAsc(result);
    Collections.reverse(result);
    return result;
  }


}
